package com.hzncc.flowable_diboot.custom_field.service.impl;

import com.baomidou.mybatisplus.extension.conditions.query.LambdaQueryChainWrapper;
import com.diboot.core.binding.Binder;
import com.diboot.core.service.impl.BaseServiceImpl;
import com.hzncc.flowable_diboot.custom_field.entity.CustomFieldValue;
import com.hzncc.flowable_diboot.custom_field.mapper.CustomFieldValueMapper;
import com.hzncc.flowable_diboot.custom_field.service.CustomFieldValueService;
import com.hzncc.flowable_diboot.custom_field.vo.CustomFieldValueListVO;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;

import java.util.List;
import java.util.Objects;


/**
* 自定义字段值 相关Service实现类
* @author MyName
* @version 1.0
* @date 2024-10-09
* Copyright © MyCorp
*/
@Slf4j
@Service
public class CustomFieldValueServiceImpl extends BaseServiceImpl<CustomFieldValueMapper, CustomFieldValue> implements CustomFieldValueService {

    /**
     * 判断字段值是否唯一
     *
     * 该方法用于检查在相同的字段id下，是否存在着相同的字段值如果存在，则不认为是唯一的
     * 如果字段值是唯一的，或者在当前实体id下字段值未改变，则返回true；否则返回false
     *
     * @param fieldValue 字段值对象，包含了要检查的字段值
     * @param fieldId 字段的唯一标识符
     * @param entityId 实体的唯一标识符，用于判断是否在同一实体下字段值未改变
     * @return 返回字段值是否唯一的布尔值如果字段值是唯一的，或者在当前实体下未改变，则返回true；否则返回false
     */
    @Override
    public Boolean isValueUnique(CustomFieldValue fieldValue, String fieldId, String entityId) {
        // 根据字段id和字段值查询数据库，看是否已存在相同的字段值
        CustomFieldValue customFieldValue = baseMapper.selectOne(lambdaQuery()
                .eq(CustomFieldValue::getFieldId, fieldId)
                .eq(CustomFieldValue::getValue, fieldValue));

        // 如果查询结果不为空，说明存在相同的字段值，需要进一步判断
        if (customFieldValue != null){
            // 比较查询到的字段值与传入的字段值是否相等，如果不相等，说明字段值已改变，返回true；否则返回false
            return !Objects.equals(customFieldValue.getValue(), fieldValue.getValue());
        }
        // 如果查询结果为空，说明字段值是唯一的，返回true
        return true;
    }

    @Override
    public List<CustomFieldValueListVO> getCustomFieldValue(List<String> entityId) {
        LambdaQueryChainWrapper<CustomFieldValue> lq = lambdaQuery().in(CustomFieldValue::getEntityId, entityId);
        List<CustomFieldValue> entityList = this.getEntityList(lq);
        return Binder.convertAndBindRelations(entityList, CustomFieldValueListVO.class);
    }
}